#ifndef CSVPARSER_H_
#define CSVPARSER_H_

#include <vector>
#include <cctype>
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <cmath>
#include <cassert>

#include "Defines.h"
#include "vdouble.h"

// Input
#define CSV_IN 1
// Output
#define CSV_OUT 2

using namespace std;

// Classe que faz a interface entre outras classes e os arquivos CSV
class CSVFile
{

public:

    // Contrói uma interface para um arquivo CSV passando seu nome e o tipo (input ou output)
    CSVFile(const char *filename, int type);
    virtual ~CSVFile();

    // Retorna verdadeiro se tiver dados a serem lidos
    bool has();
    // Lê os valores de uma linha e os coloca no vetor de entrada
    void read(vdouble& values);

    // Escreve um valor no arquivo
    void write(double value);
    // Escreve um valor no arquivo
    void write(uint& value);
    // Escreve um vetor de valores no arquivo
    void write(vdouble& values);
    // Escreve um '\n' no arquivo
    void wendl();

private:

    enum
    {
        CAPTURE_NUMBER, ELIMINATE_SPACES, GOTO_NEXT_NUMBER, END
    }; // Estados do parser

    int type; // Tipo

    char c; // Próximo caracter a ser lido (input)
    bool eof; // Flag que sinaliza final de arquivo (input)

    bool bol; // Flag que sinaliza começo de uma linha (output)

    ifstream *in; // Stream de entrada
    ofstream *out; // Stream de saída

    // Verifica se o caracter faz parte do número
    bool isNumber();
    // Lê um caracter do arquivo
    void getChar();
    // Lê caracteres até encontrar um número
    void goToNextNumber();

};

#endif /* CSVPARSER_H_ */
